#include "Hopfield.h"


int main (int argc, char ** argv) {
    
    //Patrons
    int zero[LARGEUR][HAUTEUR] = {{1,1,1,1,1,1,1,1,1},{1,-1,-1,-1,-1,-1,-1,-1,1},{1,-1,-1,-1,-1,-1,-1,-1,1},{1,-1,-1,-1,-1,-1,-1,-1,1},{1,-1,-1,-1,-1,-1,-1,-1,1},{1,-1,-1,-1,-1,-1,-1,-1,1},{1,-1,-1,-1,-1,-1,-1,-1,1},{1,-1,-1,-1,-1,-1,-1,-1,1},{1,1,1,1,1,1,1,1,1}};
    int un[LARGEUR][HAUTEUR] = {{-1,-1,-1,-1,1,-1,-1,-1,-1},{-1,-1,-1,-1,1,-1,-1,-1,-1},{-1,-1,-1,-1,1,-1,-1,-1,-1},{-1,-1,-1,-1,1,-1,-1,-1,-1},{-1,-1,-1,-1,1,-1,-1,-1,-1},{-1,-1,-1,-1,1,-1,-1,-1,-1},{-1,-1,-1,-1,1,-1,-1,-1,-1},{-1,-1,-1,-1,1,-1,-1,-1,-1},{-1,-1,-1,-1,1,-1,-1,-1,-1}};
    int deux[LARGEUR][HAUTEUR] = {{1,1,1,1,1,1,1,1,1},{-1,-1,-1,-1,-1,-1,-1,-1,1},{-1,-1,-1,-1,-1,-1,-1,-1,1},{-1,-1,-1,-1,-1,-1,-1,-1,1},{1,1,1,1,1,1,1,1,1},{1,-1,-1,-1,-1,-1,-1,-1,-1},{1,-1,-1,-1,-1,-1,-1,-1,-1},{1,-1,-1,-1,-1,-1,-1,-1,-1},{1,1,1,1,1,1,1,1,1}};
    int trois[LARGEUR][HAUTEUR] = {{1,1,1,1,1,1,1,1,1},{-1,-1,-1,-1,-1,-1,-1,-1,1},{-1,-1,-1,-1,-1,-1,-1,-1,1},{-1,-1,-1,-1,-1,-1,-1,-1,1},{1,1,1,1,1,1,1,1,1},{-1,-1,-1,-1,-1,-1,-1,-1,1},{-1,-1,-1,-1,-1,-1,-1,-1,1},{-1,-1,-1,-1,-1,-1,-1,-1,1},{1,1,1,1,1,1,1,1,1}};
    int quatre[LARGEUR][HAUTEUR] = {{1,-1,-1,-1,-1,-1,-1,-1,1},{1,-1,-1,-1,-1,-1,-1,-1,1},{1,-1,-1,-1,-1,-1,-1,-1,1},{1,-1,-1,-1,-1,-1,-1,-1,1},{1,1,1,1,1,1,1,1,1},{-1,-1,-1,-1,-1,-1,-1,-1,1},{-1,-1,-1,-1,-1,-1,-1,-1,1},{-1,-1,-1,-1,-1,-1,-1,-1,1},{-1,-1,-1,-1,-1,-1,-1,-1,1}};
    int cinq[LARGEUR][HAUTEUR] = {{1,1,1,1,1,1,1,1,1},{1,-1,-1,-1,-1,-1,-1,-1,-1},{1,-1,-1,-1,-1,-1,-1,-1,-1},{1,-1,-1,-1,-1,-1,-1,-1,-1},{1,1,1,1,1,1,1,1,1},{-1,-1,-1,-1,-1,-1,-1,-1,1},{-1,-1,-1,-1,-1,-1,-1,-1,1},{-1,-1,-1,-1,-1,-1,-1,-1,1},{1,1,1,1,1,1,1,1,1}};
    int six[LARGEUR][HAUTEUR] = {{1,1,1,1,1,1,1,1,1},{1,-1,-1,-1,-1,-1,-1,-1,-1},{1,-1,-1,-1,-1,-1,-1,-1,-1},{1,-1,-1,-1,-1,-1,-1,-1,-1},{1,1,1,1,1,1,1,1,1},{1,-1,-1,-1,-1,-1,-1,-1,1},{1,-1,-1,-1,-1,-1,-1,-1,1},{1,-1,-1,-1,-1,-1,-1,-1,1},{1,1,1,1,1,1,1,1,1}};
    int sept[LARGEUR][HAUTEUR] = {{1,1,1,1,1,1,1,1,1},{-1,-1,-1,-1,-1,-1,-1,-1,1},{-1,-1,-1,-1,-1,-1,-1,1,-1},{-1,-1,-1,-1,-1,-1,1,-1,-1},{-1,-1,-1,-1,-1,1,-1,-1,-1},{-1,-1,-1,-1,1,-1,-1,-1,-1},{-1,-1,-1,-1,1,-1,-1,-1,-1},{-1,-1,-1,-1,1,-1,-1,-1,-1},{-1,-1,-1,-1,1,-1,-1,-1,-1}};
    int huit[LARGEUR][HAUTEUR] = {{1,1,1,1,1,1,1,1,1},{1,-1,-1,-1,-1,-1,-1,-1,1},{1,-1,-1,-1,-1,-1,-1,-1,1},{1,-1,-1,-1,-1,-1,-1,-1,1},{1,1,1,1,1,1,1,1,1},{1,-1,-1,-1,-1,-1,-1,-1,1},{1,-1,-1,-1,-1,-1,-1,-1,1},{1,-1,-1,-1,-1,-1,-1,-1,1},{1,1,1,1,1,1,1,1,1}};
    int neuf[LARGEUR][HAUTEUR] = {{1,1,1,1,1,1,1,1,1},{1,-1,-1,-1,-1,-1,-1,-1,1},{1,-1,-1,-1,-1,-1,-1,-1,1},{1,-1,-1,-1,-1,-1,-1,-1,1},{1,1,1,1,1,1,1,1,1},{-1,-1,-1,-1,-1,-1,-1,-1,1},{-1,-1,-1,-1,-1,-1,-1,-1,1},{-1,-1,-1,-1,-1,-1,-1,-1,1},{1,1,1,1,1,1,1,1,1}};

	
    /* MAIN */
	printf("DEBUT\n");

	Hopfield reseau;
	
	/* PHASE 1 : INITIALISATION */
    int z = 0;
    
    //reseau.setCaractere(zero);
    //reseau.apprentissage();
    reseau.setCaractere(un);
    reseau.apprentissage();
    reseau.setCaractere(deux);
    reseau.apprentissage();
    reseau.setCaractere(trois);
    reseau.apprentissage();
    reseau.setCaractere(quatre);
    reseau.apprentissage();
    //reseau.setCaractere(cinq);
    //reseau.apprentissage();
    //reseau.setCaractere(six);
    //reseau.apprentissage();
    //reseau.setCaractere(sept);
    //reseau.apprentissage();
    //reseau.setCaractere(huit);
    //reseau.apprentissage();
    //reseau.setCaractere(neuf);
    //reseau.apprentissage();
	
    
	/* PHASE 2 : RECONNAISSANCE */
    
    int input[LARGEUR][HAUTEUR] = {{-1,-1,-1,-1,1,-1,-1,-1,-1},{-1,-1,-1,-1,1,-1,-1,-1,-1},{-1,-1,-1,-1,1,-1,-1,-1,-1},{-1,-1,-1,1,-1,-1,-1,-1,-1},{-1,-1,1,-1,-1,-1,-1,-1,-1},{-1,-1,-1,1,-1,-1,-1,-1,-1},{-1,-1,-1,-1,1,-1,-1,-1,-1},{-1,-1,-1,-1,1,-1,-1,-1,-1},{-1,-1,-1,-1,1,-1,-1,-1,-1}};
	reseau.afficherCaractere(input);
	reseau.setCaractere(input);
    
	int i =0;
	float cumulCur=0;
	float oldCumul=-1;
	while(cumulCur != oldCumul){
		reseau.transformer();
		oldCumul=cumulCur;
		cumulCur = reseau.energie();
		i++;
        printf("%d\n",i);
	}
	
	printf("\nRESULTAT\n");
	reseau.afficherCaractereCourant();
}